#include "ChequesModule.h"

// ChequesModule
extern QSqlDatabase enjoylifedb;
extern ChequeSqlTableModel *cheques_model;
extern QTableView *cheques_view;
// Cuenta Corriente
QSqlRelationalTableModel *ccs_model;
QTableView *ccs_view;
// MovimientoModule
extern QSqlRelationalTableModel *movimientos_model;
extern QTableView *movimientos_view;
extern QLineEdit *saldo_line1;

/**
 * @brief ChequesModule::ChequesModule
 * @param parent
 */
ChequesModule::ChequesModule(QWidget *parent) :
    QMainWindow(parent)
{
    cheques_toolbar = new CustomModulesToolbar(this);
    AltaChequesToolBar();
    BajaChequesToolBar();
    ModificarChequesToolBar();
    CobrarChequeToolBar();
    UpdateChequesListToolBar();
    ABMPersonaToolBar();
    ABMConceptoToolBar();
    addToolBar(cheques_toolbar);

    cheques_model = new ChequeSqlTableModel(this,enjoylifedb);
    cheques_model->setTable("cheques");
    cheques_model->setEditStrategy(ChequeSqlTableModel::OnFieldChange);

    ccs_model = new QSqlRelationalTableModel();

    cheques_view = new QTableView(this);
    setCentralWidget(cheques_view);

    QWidget* widget_main = new QWidget();
    QWidget* widget_derecho = new QWidget();

    QGridLayout *grid_lay = new QGridLayout();
    QGridLayout *grid_derecho = new QGridLayout();

    QGroupBox *group_father = new QGroupBox("Filtros y Búsquedas",this);
    QFormLayout *form_date = new QFormLayout;

    QLabel *date_label = new QLabel("Filtrar por Fecha Recibido",0);
    date_label->setFixedWidth(190);
    date_label->setFixedHeight(20);
    date_label->setAlignment(Qt::AlignCenter);
    date_label->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_date->addRow(date_label);

    recibidos_hoy = new QRadioButton("Recibidos hoy",0);
    connect(recibidos_hoy,SIGNAL(clicked()),this,SLOT(RecibidosHoy()));
    form_date->addRow(recibidos_hoy);

    recibidos_mesPasado = new QRadioButton("El mes pasado",0);
    connect(recibidos_mesPasado,SIGNAL(clicked()),this,SLOT(RecibidosMesPasado()));
    form_date->addRow(recibidos_mesPasado);

    recibidos_mesCorriente = new QRadioButton("El corriente mes",0);
    connect(recibidos_mesCorriente,SIGNAL(clicked()),this,SLOT(RecibidosMesCorriente()));
    form_date->addRow(recibidos_mesCorriente);

    recibidos_anioPasado = new QRadioButton("El año pasado",0);
    connect(recibidos_anioPasado,SIGNAL(clicked()),this,SLOT(RecibidosAnioPasado()));
    form_date->addRow(recibidos_anioPasado);

    recibidos_anioCorriente = new QRadioButton("El corriente año",0);
    connect(recibidos_anioCorriente,SIGNAL(clicked()),this,SLOT(RecibidosAnioCorriente()));
    form_date->addRow(recibidos_anioCorriente);

    QLabel *filter_label = new QLabel("Búsqueda Rápida",0);
    filter_label->setFixedWidth(190);
    filter_label->setFixedHeight(20);
    filter_label->setAlignment(Qt::AlignCenter);
    filter_label->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_date->addRow(filter_label);

    encontrar_persona = new QRadioButton("Persona",0);
    connect(encontrar_persona,SIGNAL(clicked()),this,SLOT(EncontrarPersona()));
    form_date->addRow(encontrar_persona);

    encontrar_concepto = new QRadioButton("Concepto",0);
    connect(encontrar_concepto,SIGNAL(clicked()),this,SLOT(EncontrarConcepto()));
    form_date->addRow(encontrar_concepto);

    encontrar_fechaRecibido = new QRadioButton("Fecha Recibido",0);
    connect(encontrar_fechaRecibido,SIGNAL(clicked()),this,SLOT(EncontrarFechaRecibido()));
    form_date->addRow(encontrar_fechaRecibido);

    encontrar_fechaCobro = new QRadioButton("Fecha Cobro",0);
    connect(encontrar_fechaCobro,SIGNAL(clicked()),this,SLOT(EncontrarFechaCobro()));
    form_date->addRow(encontrar_fechaCobro);

    campoBusqueda = new QLineEdit(this);
    campoBusqueda->setFixedWidth(190);
    campoBusqueda->setEnabled(false);
    form_date->addRow(campoBusqueda);

    //
    QPixmap SITIimage("://Images/SITI-Soft_Logo.png");
    QLabel *SITILabel = new QLabel("",0);
    SITILabel->setPixmap(SITIimage);
    SITILabel->setFixedHeight(225);
    SITILabel->setAlignment(Qt::AlignCenter);

    group_father->setLayout(form_date);
    group_father->setFixedWidth(210);

    grid_derecho->addWidget(group_father,0,0);
    grid_derecho->addWidget(SITILabel,1,0);
    widget_derecho->setFixedWidth(220);
    widget_derecho->setLayout(grid_derecho);

    grid_lay->addWidget(cheques_view,0,0);
    grid_lay->addWidget(widget_derecho,0,1);

    widget_main->setLayout(grid_lay);
    setCentralWidget(widget_main);

    // Doble click sobre un cheque abre la edición.
    connect(cheques_view,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(ModificarChequesBtn()));
    UpdateChequesListBtn();

    // Definición de acceso directo para agregar un registro mediante la combinacion de teclas "Ctrl + A".
    QShortcut* shortcutAlta = new QShortcut(QKeySequence("Ctrl+A"), cheques_view);
    connect(shortcutAlta, SIGNAL(activated()), this, SLOT(AltaChequesBtn()));
    // Definición de acceso directo para borrar un registro mediante la tecla "Supr".
    QShortcut* shortcutBaja = new QShortcut(QKeySequence(QKeySequence::Delete), cheques_view);
    connect(shortcutBaja, SIGNAL(activated()), this, SLOT(BajaChequesBtn()));
    // Definición de acceso directo para modificar un registro mediante la combinacion de teclas "Ctrl + M".
    QShortcut* shortcutModif = new QShortcut(QKeySequence("Ctrl+M"), cheques_view);
    connect(shortcutModif, SIGNAL(activated()), this, SLOT(ModificarChequesBtn()));
    // Definición de acceso directo para cobrar un cheque mediante la combinacion de teclas "Ctrl + Alt + C".
    QShortcut* shortcutCobrar = new QShortcut(QKeySequence("Ctrl+Alt+C"), cheques_view);
    connect(shortcutCobrar, SIGNAL(activated()), this, SLOT(CobrarChequeBtn()));
    // Definición de acceso directo para actualizr la lista mediante la combinacion de teclas "Ctrl + U".
    QShortcut* shortcutActualizar = new QShortcut(QKeySequence("Ctrl+U"), this);
    connect(shortcutActualizar, SIGNAL(activated()), this, SLOT(UpdateChequesListBtn()));
    // Definición de acceso directo para abrir abm de conceptos mediante la combinacion de teclas "Ctrl + C".
    QShortcut* shortcutABMConcepto = new QShortcut(QKeySequence("Ctrl+C"), this);
    connect(shortcutABMConcepto, SIGNAL(activated()), this, SLOT(ABMConceptoBtn()));
    // Definición de acceso directo para abrir abm de personas mediante la combinacion de teclas "Ctrl + P".
    QShortcut* shortcutABMPersona = new QShortcut(QKeySequence("Ctrl+P"), this);
    connect(shortcutABMPersona, SIGNAL(activated()), this, SLOT(ABMPersonaBtn()));
}

/*
 * Ícono: AltaCheques.
 */
void ChequesModule::AltaChequesToolBar()
{
    accion_altaCheques = new QAction("Nuevo Cheque",this);
    accion_altaCheques->setIcon(QIcon("://Icons/BarraHerramientas/alta48.png"));
    accion_altaCheques->setToolTip("Carga cheques");
    cheques_toolbar->addAction(accion_altaCheques);

    connect(accion_altaCheques,SIGNAL(triggered()),this,SLOT(AltaChequesBtn()));
}

/*
 * Ícono: BajaCheques.
 */
void ChequesModule::BajaChequesToolBar()
{
    accion_bajaCheques = new QAction("Eliminar Cheque",this);
    accion_bajaCheques->setIcon(QIcon("://Icons/BarraHerramientas/baja48.png"));
    accion_bajaCheques->setToolTip("Elimina cheques");
    cheques_toolbar->addAction(accion_bajaCheques);

    connect(accion_bajaCheques,SIGNAL(triggered()),this,SLOT(BajaChequesBtn()));
}

/*
 * Ícono: ModificaciónCheques.
 */
void ChequesModule::ModificarChequesToolBar()
{
    accion_modificacionCheques = new QAction("Modificar Cheque",this);
    accion_modificacionCheques->setIcon(QIcon("://Icons/BarraHerramientas/modificar48.png"));
    accion_modificacionCheques->setToolTip("Edita cheques");
    cheques_toolbar->addAction(accion_modificacionCheques);

    connect(accion_modificacionCheques,SIGNAL(triggered()),this,SLOT(ModificarChequesBtn()));
}

/*
 * Ícono: CobrarCheques.
 */
void ChequesModule::CobrarChequeToolBar()
{
    accion_cobrarCheques = new QAction("Cobrar Cheque",this);
    accion_cobrarCheques->setIcon(QIcon("://Icons/BarraHerramientas/aceptado48.png"));
    accion_cobrarCheques->setToolTip("Marcar como cobrado un cheque");
    cheques_toolbar->addAction(accion_cobrarCheques);

    connect(accion_cobrarCheques,SIGNAL(triggered()),this,SLOT(CobrarChequeBtn()));
}

/*
 * Icono: Actualizar lista de movimientos.
 */
void ChequesModule::UpdateChequesListToolBar()
{
    accion_updateChequesList = new QAction("Actualizar Lista Cheq.",this);
    accion_updateChequesList->setIcon(QIcon("://Icons/BarraHerramientas/actualizar48.png"));
    accion_updateChequesList->setToolTip("Actualiza la lista de cheques");
    cheques_toolbar->addSeparator();
    cheques_toolbar->addAction(accion_updateChequesList);
    cheques_toolbar->addSeparator();

    connect(accion_updateChequesList,SIGNAL(triggered()),this,SLOT(UpdateChequesListBtn()));
}

/*
 * Icono: ABMPersona.
 */
void ChequesModule::ABMPersonaToolBar()
{
    accion_abmPersona = new QAction("ABM Persona",this);
    accion_abmPersona->setIcon(QIcon("://Icons/BarraHerramientas/abmPersonas48.png"));
    accion_abmPersona->setToolTip("Administra Personas");
    cheques_toolbar->addAction(accion_abmPersona);

    connect(accion_abmPersona,SIGNAL(triggered()),this,SLOT(ABMPersonaBtn()));
}

/*
 * Icono: ABMConcepto.
 */
void ChequesModule::ABMConceptoToolBar()
{
    accion_abmConcepto = new QAction("ABM Concepto",this);
    accion_abmConcepto->setIcon(QIcon("://Icons/BarraHerramientas/abmConceptos48.png"));
    accion_abmConcepto->setToolTip("Administra Conceptos");
    cheques_toolbar->addAction(accion_abmConcepto);

    connect(accion_abmConcepto,SIGNAL(triggered()),this,SLOT(ABMConceptoBtn()));
}

/*
 * Acción del botón: ejecuta la ventana para realizar altas de cheques.
 */
void ChequesModule::AltaChequesBtn()
{
    AltaCheque *alta_cheque = new AltaCheque();
    alta_cheque->show();
    CorrectViewOfModel();
}

/*
 * Acción del botón: ejecuta la baja de un cheque
 */
void ChequesModule::BajaChequesBtn()
{
    QString cobrado, id_Cheque;

    // Se controla para el caso que no existan cheques cargados.
    if (cheques_model->rowCount() == 0) {
        QMessageBox::information(this,"Información!","No hay cheques disponibles.");
        return;
    }

    QModelIndexList selection;
    if (!(cheques_view->currentIndex().row() == -1)) {
        selection.append(cheques_view->currentIndex());
    }

    if (!selection.empty()) {
        QModelIndex idIndex = selection.first();

        cobrado = cheques_model->index(idIndex.row(), 7).data().toString();
        id_Cheque = cheques_model->index(idIndex.row(), 0).data().toString();
        QMessageBox::StandardButton button;
        if (cobrado == "SI") {
            button = QMessageBox::question(this, tr("Eliminar Cheque"),
                                           tr("El cheque que desea eliminar está marcado como cobrado! "
                                              "Si se elimina será removido automaticamente de la planilla de movimientos. "
                                              "\n¿Desea continuar?"),
                                           QMessageBox::Yes | QMessageBox::No);
        } else {
            button = QMessageBox::question(this, tr("Eliminar Cheque"),
                                           tr("¿Está seguro que quiere eliminar este cheque?"),
                                           QMessageBox::Yes | QMessageBox::No);
        }

        if (button == QMessageBox::Yes) {
            bool ccAsoc = false;
            enjoylifedb.transaction();
            // Se elimina el Cheque seleccionado de la tabla cheque
            if (!cheques_model->removeRow(idIndex.row())) {
                QMessageBox::critical(this,"Error!", "No se pudo eliminar el Cheque, vuelva a intentarlo.");
                enjoylifedb.rollback();
                return;
            }
            // Se elimina el cheque de los movimientos si está marcado como cobrado
            if (cobrado == "SI") {
                // Modifico Cta Cte.
                QString filtroCC = "tipo_moneda = 'Cheque'";
                filtroCC.append(" and id_moneda = '").append(id_Cheque).append("'");
                ccs_model->setTable("cuenta_corriente");
                ccs_model->setFilter(filtroCC);
                enjoylifedb.transaction();
                if (!ccs_model->select()) {
                    // Cheque no asoc a cc y si cobrado. Error al recuperar los datos de cc
                    QString error = ccs_model->lastError().text();
                    QMessageBox::critical(this,"Error!", tr("No se pudo recuperar los datos de Ctas. Ctes. Intentelo nuevamente."
                                                            "\n %1").arg(error));
                    enjoylifedb.rollback();
                    return;
                }else {
                    // Cheque asoc a cc y cobrado. 1-Se modifica cc. 2-Se elimina el cheque de movimientos
                    int cantRows = ccs_model->rowCount();
                    for (int i = 0; i < cantRows; ++i) {
                        ccAsoc = true;
                        // 1-Se modifica cc.
                        QSqlRecord record = ccs_model->record(i);
                        record.setValue("estado_deuda","No informado");
                        record.setValue("tipo_moneda","Efectivo");
                        record.setValue("id_moneda","");
                        ccs_model->setRecord(i, record);
                        enjoylifedb.transaction();
                        if (!ccs_model->submitAll()) {
                            QString error = ccs_model->lastError().text();
                            QMessageBox::critical(this,"Error!", tr("No se pudo actualizar el estado de una Cta. Cte. Por favor controle las Ctas. Ctes."
                                                                    "\n %1").arg(error));
                            enjoylifedb.rollback();
                            return;
                        }
                    }
                    ControlVencimientos();
                }
                // 2-Se elimina el cheque de movimientos
                enjoylifedb.transaction();
                QSqlQuery *query = new QSqlQuery(enjoylifedb);
                QString stm = "delete from movimiento where idMoneda = '" + id_Cheque + "'";
                if (! query->exec(stm)) {
                    QMessageBox::critical(this,"Error!", "No se pudo remover el cheque de los movimientos, "
                                          "intentelo nuevamente || " + query->lastError().text());
                    enjoylifedb.rollback();
                    return;
                }

                if (ccAsoc) {
                    enjoylifedb.commit();
                    enjoylifedb.commit();
                    enjoylifedb.commit();
                    QMessageBox::information(this,"AVISO!", "El cheque fue eliminado de movimientos. Y las Ctas. Ctes. "
                                             "asociads fueron actualizadas.");
                } else {
                    enjoylifedb.commit();
                    enjoylifedb.commit();
                    QMessageBox::information(this,"AVISO!", "El cheque fue eliminado de movimientos.");
                }
            }
            // Cheque no cobrado
            else {
                // Modifico Cta Cte.
                QString filtroCC = "tipo_moneda = 'Cheque'";
                filtroCC.append(" and id_moneda = '").append(id_Cheque).append("'");
                ccs_model->setTable("cuenta_corriente");
                ccs_model->setFilter(filtroCC);
                enjoylifedb.transaction();
                if (!ccs_model->select()) {
                    // Cheque no asoc a cc y no cobrado.
                    enjoylifedb.rollback();
                    return;
                }else {
                    // Cheque asoc a cc y no cobrado. 1-Se modifica cc.
                    enjoylifedb.commit();
                    int cantRows = ccs_model->rowCount();
                    for (int i = 0; i < cantRows; ++i) {
                        // 1-Se modifica cc.
                        QSqlRecord record = ccs_model->record(i);
                        record.setValue("estado_deuda","No informado");
                        record.setValue("tipo_moneda","Efectivo");
                        record.setValue("id_moneda","");
                        ccs_model->setRecord(i, record);
                        enjoylifedb.transaction();
                        if (!ccs_model->submitAll()) {
                            QString error = ccs_model->lastError().text();
                            QMessageBox::critical(this,"Error!", tr("No se pudo actualizar el estado de una Cta. Cte. Por favor controle las Ctas. Ctes."
                                                                    "\n %1").arg(error));
                            enjoylifedb.rollback();
                            return;
                        }
                        enjoylifedb.commit();
                    }
                    ControlVencimientos();
                    QMessageBox::information(this,"AVISO!", "El cheque fue eliminado correctamente. Y las Ctas. Ctes. "
                                             "asociads fueron actualizadas.");
                }
            }
            enjoylifedb.commit();
        }
        else
            return;
    }
    else {
        QMessageBox::warning(this, tr("Eliminar Cheque"),
                             tr("La operación no se puede concretar."
                                "\nNingún cheque ha sido seleccionado."));
    }
    UpdateChequesListBtn();
}

/*
 * Lanzamiento del formulario para modificar los datos de un cheque.
 */
void ChequesModule::ModificarChequesBtn()
{
    // Se controla para el caso que no existan cheques cargados.
    if (cheques_model->rowCount() == 0) {
        QMessageBox::information(this,"Información!","No hay cheques disponibles.");
        return;
    }

    int selection = -1;
    if (!(cheques_view->currentIndex().row() == -1)) {
        selection = cheques_view->currentIndex().row();
    }

    if (!(selection == -1)) {
        enjoylifedb.transaction();

        ModificacionCheque *edit_cheque_form = new ModificacionCheque();
        edit_cheque_form->GetChequesInfo(selection);
        edit_cheque_form->show();

        enjoylifedb.commit();
        UpdateChequesListBtn();
    } else {
        QMessageBox::warning(this, tr("Modificar Cheque"),
                             tr("La operación no se puede concretar."
                                "\nNingún cheque ha sido seleccionado."));
    }
}

/*
 * Lanzamiento del formulario para marcar como cobrado un cheque.
 */
void ChequesModule::CobrarChequeBtn()
{
    // Se controla para el caso que no existan cheques cargados.
    if (cheques_model->rowCount() == 0) {
        QMessageBox::information(this,"Información!","No hay cheques disponibles.");
        return;
    }

    int selection = -1;
    if (!(cheques_view->currentIndex().row() == -1)) {
        selection = cheques_view->currentIndex().row();
    }

    if (!(selection == -1)) {
        enjoylifedb.transaction();

        CobrarCheque *cobrar_cheque_form = new CobrarCheque();
        cobrar_cheque_form->GetChequesInfo(selection);
        cobrar_cheque_form->show();

        enjoylifedb.commit();
        UpdateChequesListBtn();
    } else {
        QMessageBox::warning(this, tr("Cobrar Cheque"),
                             tr("La operación no se puede concretar."
                                "\nNingún cheque ha sido seleccionado."));
    }

//    cheques_view->currentIndex().model()->setData(Qt::blue, Qt::BackgroundRole);
}

/*
 * Acción del boton: Actualiza la lista de cheques.
 */
void ChequesModule::UpdateChequesListBtn()
{
    enjoylifedb.transaction();
    cheques_model->setTable("cheque");
    if (!(cheques_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    CorrectViewOfModel();
}

/*
 * Lanzamiento del formulario para admin personas.
 */
void ChequesModule::ABMPersonaBtn()
{
    ABMPersona *abm_persona = new ABMPersona();
    abm_persona->show();
    CorrectViewOfModel();
}

/*
 * Lanzamiento del formulario para admin conceptos.
 */
void ChequesModule::ABMConceptoBtn()
{
    ABMConcepto *abm_concepto = new ABMConcepto();
    abm_concepto->show();
    CorrectViewOfModel();
}

void ChequesModule::ControlVencimientos()
{
    QDate date2;
    QString formatoMes = "MM";
    QString mes = date2.currentDate().toString(formatoMes);
    QString formatoAnio = "yyyy";
    QString anio = date2.currentDate().toString(formatoAnio);
    QString filtro = "date_part('month', desde) <= '";
    filtro.append(mes).append("'");
    filtro.append(" and date_part('year', desde) <= '");
    filtro.append(anio).append("'");
    filtro.append(" and estado_deuda = 'No informado'");

    ccs_model->setTable("cuenta_corriente");
    ccs_model->setFilter(filtro);
    enjoylifedb.transaction();
    if (!ccs_model->select()) {
        QMessageBox::critical(this,"Advertencia","No se pudo actualizar los estados de las Ctas. Ctes.");
        enjoylifedb.rollback();
        return;
    }
    else {
        enjoylifedb.commit();
        int cantRows = ccs_model->rowCount();
        for (int i = 0; i < cantRows; ++i) {
            QSqlRecord record = ccs_model->record(i);
            record.setValue("estado_deuda","Debe");
            ccs_model->setRecord(i, record);
            enjoylifedb.transaction();
            if (!ccs_model->submitAll()) {
                QString error = ccs_model->lastError().text();
                QMessageBox::critical(this,"Error!", tr("No se pudo actualizar el estado de una Cta. Cte. Por favor controle las Ctas. Ctes."
                                                        "\n %1").arg(error));
                enjoylifedb.rollback();
                return;
            }
            enjoylifedb.commit();
        }
    }
}

/*
 * Acomoda la vista del modulo Movimientos.
 */
void ChequesModule::CorrectViewOfModel()
{
    cheques_model->setHeaderData(0,Qt::Horizontal,"ID Cheque");
    cheques_model->setHeaderData(1,Qt::Horizontal,"Nro. Cheque");
    cheques_model->setHeaderData(2,Qt::Horizontal,"Banco");
    cheques_model->setHeaderData(3,Qt::Horizontal,"Fecha Recibido");
    cheques_model->setHeaderData(4,Qt::Horizontal,"Fecha Cobro");
    cheques_model->setHeaderData(5,Qt::Horizontal,"Persona");
    cheques_model->setHeaderData(6,Qt::Horizontal,"Concepto");
    cheques_model->setHeaderData(7,Qt::Horizontal,"Monto");

    cheques_view->setModel(cheques_model);
    cheques_view->setCornerButtonEnabled(true);
    cheques_view->setAlternatingRowColors(true);
    cheques_view->setGridStyle(Qt::SolidLine);
    cheques_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    cheques_view->setWordWrap(true);
    cheques_view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    cheques_view->sortByColumn(1,Qt::SortOrder());
    cheques_view->hideColumn(8);

//    cheques_view->setColumnWidth(0,90);
//    cheques_view->setColumnWidth(1,90);
//    cheques_view->setColumnWidth(2,90);
//    cheques_view->setColumnWidth(3,330);
//    cheques_view->setColumnWidth(4,330);
//    cheques_view->setColumnWidth(5,100);
    cheques_view->scrollToBottom();
}

// Funciones para actualizar correctamente la vista y el saldo en movimientos

///*
// * Acción del boton: Actualiza la lista de moviemientos.
// */
//void ChequesModule::UpdateMovimientosList()
//{
//    QDate date;
//    date.setDate(date.currentDate().year(),date.currentDate().month(),date.currentDate().day());
//    QString formatYear = "yyyy";
//    QString formatMonth = "MM";
//    QString anio, mes;
//    anio = date.toString(formatYear);
//    mes = date.toString(formatMonth);

//    QString filtroMov;
//    filtroMov = "date_part('year', fecha_mov) = '" + anio + "'";
//    filtroMov = filtroMov + " and date_part('month', fecha_mov) = '" + mes + "'";
//    movimientos_model->setTable("movimiento");
//    movimientos_model->filter().clear();
//    movimientos_model->setFilter(filtroMov);
//    if (!(movimientos_model->select())) {
//        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
//        enjoylifedb.rollback();
//        return;
//    }
//    enjoylifedb.commit();
//    CorrectViewOfModelMov();
//    CalcularSaldoMensual();
//}

///*
// * Acomoda la vista del modulo Movimientos.
// */
//void ChequesModule::CorrectViewOfModelMov()
//{
//    movimientos_model->setHeaderData(1,Qt::Horizontal,"Fecha");
//    movimientos_model->setHeaderData(2,Qt::Horizontal,"Persona");
//    movimientos_model->setHeaderData(3,Qt::Horizontal,"Concepto");
//    movimientos_model->setHeaderData(4,Qt::Horizontal,"Tipo Moneda");
//    movimientos_model->setHeaderData(5,Qt::Horizontal,"Debe");
//    movimientos_model->setHeaderData(6,Qt::Horizontal,"Haber");

//    movimientos_view->setModel(movimientos_model);
//    movimientos_view->setCornerButtonEnabled(true);
//    movimientos_view->setAlternatingRowColors(true);
//    movimientos_view->setGridStyle(Qt::SolidLine);
//    movimientos_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
//    movimientos_view->setWordWrap(true);
//    movimientos_view->horizontalHeader()->setStretchLastSection(true);
//    movimientos_view->sortByColumn(1,Qt::SortOrder());
//    movimientos_view->hideColumn(0);
//    movimientos_view->hideColumn(7);

//    movimientos_view->setColumnWidth(1,90);
//    movimientos_view->setColumnWidth(2,300);
//    movimientos_view->setColumnWidth(3,300);
//    movimientos_view->setColumnWidth(4,120);
//    movimientos_view->setColumnWidth(5,100);
//    movimientos_view->setColumnWidth(6,100);
//}

///*
// *
// */
//void ChequesModule::CalcularSaldoMensual()
//{
//    QDate date;
//    date.setDate(date.currentDate().year(), date.currentDate().month(), date.currentDate().day());
//    QString formatYear = "yyyy";
//    QString formatMonth = "MM";
//    QString anio, mes;
//    anio = date.toString(formatYear);
//    mes = date.toString(formatMonth);
//    QString filtroMov;
//    filtroMov = "date_part('year', fecha_mov) = '" + anio + "'";
//    filtroMov = filtroMov + " and date_part('month', fecha_mov) = '" + mes + "'";

//    enjoylifedb.transaction();
//    QSqlQuery *query = new QSqlQuery(enjoylifedb);
//    QString stm = "select sum(debe) as sumDebe, sum(haber) as sumHaber from movimiento where " + filtroMov;
//    if (! query->exec(stm)) {
//        QMessageBox::critical(this,"Error!", "No se pudo recuperar los datos necesarios para calcular el saldo actual, "
//                              "intentelo nuevamente || " + query->lastError().text());
//        enjoylifedb.rollback();
//        return;
//    }

//    double sumDebe, sumHaber;
//    while (query->next()) {
//        if (query->last()) {
//            sumDebe = query->value(query->record().indexOf("sumDebe")).toDouble();
//            sumHaber = query->value(query->record().indexOf("sumHaber")).toDouble();
//        }
//    }
//    QVariant val = sumDebe - sumHaber;
//    const int precision = 2;
//    saldo_line1->setText(QString("%1").arg(val.toDouble(), 0, 'f', precision));

//    enjoylifedb.commit();
//}

// Filtros

void ChequesModule::RecibidosHoy()
{
    campoBusqueda->setEnabled(false);
    campoBusqueda->clear();
    QDate date;
    QString format = "yyyy-MM-dd";
    date.setDate(date.currentDate().year(), date.currentDate().month(), date.currentDate().day());
    QString fecha = date.toString(format);
    if (recibidos_hoy->isChecked()) {
        enjoylifedb.transaction();
        filtroCheques = "fecha_recibido = '" + fecha + "'";
        cheques_model->setTable("cheque");
        cheques_model->filter().clear();
        cheques_model->setFilter(filtroCheques);
        if (!(cheques_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateChequesListBtn();
            return;
        }
        enjoylifedb.commit();
        CorrectViewOfModel();
    }
}

void ChequesModule::RecibidosMesPasado()
{
    campoBusqueda->setEnabled(false);
    campoBusqueda->clear();
    QDate date;
    QString formatYear = "yyyy";
    QString formatMonth = "MM";
    QString anio;
    QString mes;
    if (date.currentDate().month() == 1) {
        date.setDate(date.currentDate().year() - 1, 12, date.currentDate().day());
        anio = date.toString(formatYear);
        mes = date.toString(formatMonth);
    }
    else {
        date.setDate(date.currentDate().year(), date.currentDate().month() - 1, date.currentDate().day());
        anio = date.toString(formatYear);
        mes = date.toString(formatMonth);
    }
    if (recibidos_mesPasado->isChecked()) {
        enjoylifedb.transaction();
        filtroCheques = "date_part('year',fecha_recibido)='" + anio + "'";
        filtroCheques = filtroCheques + " and date_part('month',fecha_recibido)='" + mes + "'";
        cheques_model->setTable("cheque");
        cheques_model->filter().clear();
        cheques_model->setFilter(filtroCheques);
        if (!(cheques_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateChequesListBtn();
            return;
        }
        enjoylifedb.commit();
        CorrectViewOfModel();
    }
}

void ChequesModule::RecibidosMesCorriente()
{
    campoBusqueda->setEnabled(false);
    campoBusqueda->clear();
    QDate date;
    QString formatYear = "yyyy";
    QString formatMonth = "MM";
    QString anio;
    QString mes;
    date.setDate(date.currentDate().year(), date.currentDate().month(), date.currentDate().day());
    anio = date.toString(formatYear);
    mes = date.toString(formatMonth);
    if (recibidos_mesCorriente->isChecked()) {
        enjoylifedb.transaction();
        filtroCheques = "date_part('year',fecha_recibido)='" + anio + "'";
        filtroCheques = filtroCheques + " and date_part('month',fecha_recibido)='" + mes + "'";
        cheques_model->setTable("cheque");
        cheques_model->filter().clear();
        cheques_model->setFilter(filtroCheques);
        if (!(cheques_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateChequesListBtn();
            return;
        }
        enjoylifedb.commit();
        CorrectViewOfModel();
    }
}

void ChequesModule::RecibidosAnioPasado()
{
    campoBusqueda->setEnabled(false);
    campoBusqueda->clear();
    QDate date;
    QString formatYear = "yyyy";
    QString anio;
    date.setDate(date.currentDate().year() - 1, date.currentDate().month(), date.currentDate().day());
    anio = date.toString(formatYear);
    if (recibidos_anioPasado->isChecked()) {
        enjoylifedb.transaction();
        filtroCheques = "date_part('year',fecha_recibido)='" + anio + "'";
        cheques_model->setTable("cheque");
        cheques_model->filter().clear();
        cheques_model->setFilter(filtroCheques);
        if (!(cheques_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateChequesListBtn();
            return;
        }
        enjoylifedb.commit();
        CorrectViewOfModel();
    }
}

void ChequesModule::RecibidosAnioCorriente()
{
    campoBusqueda->setEnabled(false);
    campoBusqueda->clear();
    QDate date;
    QString formatYear = "yyyy";
    QString anio;
    date.setDate(date.currentDate().year(), date.currentDate().month(), date.currentDate().day());
    anio = date.toString(formatYear);
    if (recibidos_anioCorriente->isChecked()) {
        enjoylifedb.transaction();
        filtroCheques = "date_part('year',fecha_recibido)='" + anio + "'";
        cheques_model->setTable("cheque");
        cheques_model->filter().clear();
        cheques_model->setFilter(filtroCheques);
        if (!(cheques_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateChequesListBtn();
            return;
        }
        enjoylifedb.commit();
        CorrectViewOfModel();
    }
}

void ChequesModule::EncontrarPersona()
{
    if (encontrar_persona->isChecked()) {
        UpdateChequesListBtn();
        encontrar_concepto->setChecked(false);
        encontrar_fechaRecibido->setChecked(false);
        encontrar_fechaCobro->setChecked(false);
        disconnect(campoBusqueda,SIGNAL(returnPressed()),this,SLOT(FiltroConcepto()));
        disconnect(campoBusqueda,SIGNAL(returnPressed()),this,SLOT(FiltroFechaRecibido()));
        disconnect(campoBusqueda,SIGNAL(returnPressed()),this,SLOT(FiltroFechaCobro()));
        campoBusqueda->setEnabled(true);
        connect(campoBusqueda,SIGNAL(returnPressed()),this,SLOT(FiltroPersona()));
    }
    else
        campoBusqueda->setEnabled(false);
}

void ChequesModule::FiltroPersona()
{
    if (!campoBusqueda->text().isEmpty()) {
        enjoylifedb.transaction();
        filtroCheques = "c_persona ilike '%" + campoBusqueda->text() + "%'";
        cheques_model->setTable("cheque");
        cheques_model->filter().clear();
        cheques_model->setFilter(filtroCheques);
        if (!(cheques_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateChequesListBtn();
            return;
        }
        else {
            enjoylifedb.commit();
            CorrectViewOfModel();
        }
    }
    else
        UpdateChequesListBtn();
}

void ChequesModule::EncontrarConcepto()
{
    if (encontrar_concepto->isChecked()) {
        UpdateChequesListBtn();
        encontrar_persona->setChecked(false);
        encontrar_fechaRecibido->setChecked(false);
        encontrar_fechaCobro->setChecked(false);
        disconnect(campoBusqueda,SIGNAL(returnPressed()),this,SLOT(FiltroPersona()));
        disconnect(campoBusqueda,SIGNAL(returnPressed()),this,SLOT(FiltroFechaRecibido()));
        disconnect(campoBusqueda,SIGNAL(returnPressed()),this,SLOT(FiltroFechaCobro()));
        campoBusqueda->setEnabled(true);
        connect(campoBusqueda,SIGNAL(returnPressed()),this,SLOT(FiltroConcepto()));
    }
    else
        campoBusqueda->setEnabled(false);
}

void ChequesModule::FiltroConcepto()
{
    if (!campoBusqueda->text().isEmpty()) {
        enjoylifedb.transaction();
        filtroCheques = "c_concepto ilike '%" + campoBusqueda->text() + "%'";
        cheques_model->setTable("cheque");
        cheques_model->filter().clear();
        cheques_model->setFilter(filtroCheques);
        if (!(cheques_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateChequesListBtn();
            return;
        }
        else {
            enjoylifedb.commit();
            CorrectViewOfModel();
        }
    }
    else
        UpdateChequesListBtn();
}

void ChequesModule::EncontrarFechaRecibido()
{
    if (encontrar_fechaRecibido->isChecked()) {
        UpdateChequesListBtn();
        encontrar_persona->setChecked(false);
        encontrar_concepto->setChecked(false);
        encontrar_fechaCobro->setChecked(false);
        disconnect(campoBusqueda,SIGNAL(returnPressed()),this,SLOT(FiltroPersona()));
        disconnect(campoBusqueda,SIGNAL(returnPressed()),this,SLOT(FiltroConcepto()));
        disconnect(campoBusqueda,SIGNAL(returnPressed()),this,SLOT(FiltroFechaCobro()));
        campoBusqueda->setEnabled(true);
        connect(campoBusqueda,SIGNAL(returnPressed()),this,SLOT(FiltroFechaRecibido()));
    }
    else
        campoBusqueda->setEnabled(false);
}

void ChequesModule::FiltroFechaRecibido()
{
    if (!campoBusqueda->text().isEmpty()) {
        enjoylifedb.transaction();
        filtroCheques = "fecha_recibido = '" + campoBusqueda->text() + "'";
        cheques_model->setTable("cheque");
        cheques_model->filter().clear();
        cheques_model->setFilter(filtroCheques);
        if (!(cheques_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateChequesListBtn();
            return;
        }
        else {
            enjoylifedb.commit();
            CorrectViewOfModel();
        }
    }
    else
        UpdateChequesListBtn();
}

void ChequesModule::EncontrarFechaCobro()
{
    if (encontrar_fechaCobro->isChecked()) {
        UpdateChequesListBtn();
        encontrar_persona->setChecked(false);
        encontrar_concepto->setChecked(false);
        encontrar_fechaRecibido->setChecked(false);
        disconnect(campoBusqueda,SIGNAL(returnPressed()),this,SLOT(FiltroPersona()));
        disconnect(campoBusqueda,SIGNAL(returnPressed()),this,SLOT(FiltroConcepto()));
        disconnect(campoBusqueda,SIGNAL(returnPressed()),this,SLOT(FiltroFechaRecibido()));
        campoBusqueda->setEnabled(true);
        connect(campoBusqueda,SIGNAL(returnPressed()),this,SLOT(FiltroFechaCobro()));
    }
    else
        campoBusqueda->setEnabled(false);
}

void ChequesModule::FiltroFechaCobro()
{
    if (!campoBusqueda->text().isEmpty()) {
        enjoylifedb.transaction();
        filtroCheques = "fecha_cobro = '" + campoBusqueda->text() + "'";
        cheques_model->setTable("cheque");
        cheques_model->filter().clear();
        cheques_model->setFilter(filtroCheques);
        if (!(cheques_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateChequesListBtn();
            return;
        }
        else {
            enjoylifedb.commit();
            CorrectViewOfModel();
        }
    }
    else
        UpdateChequesListBtn();
}
